// 此文件是设置全局路由钩子，在路由跳转的时候进行权限控制，如果有自定义的权限拦截方案，在此文件中进行相应的修改和配置。
// 另外，如果路由守卫被如此例一样定义在一个单独的文件，而不是在router定义文件内的话，需要在main.js里import。

import router  from '../router'
import store from '../store'
import { Message } from 'element-ui'

// 一些定义
const loginPath = '/login'
const homePath = '/home'

// 权限白名单，数组内的页面路由是不被拦截校验权限的。如果需要不校验权限，把路由地址放到白名单数组内。
const whiteList = [loginPath]

router.beforeEach(async(to, from, next) => {
    console.log(to.path)
    // 动态修改页面在浏览器上的标题
    document.title = to.meta.title || ''


    // 白名单外需要判断是否拥有token，无token的话需要重新登录
    const hasToken = store.getters.token
    console.log(hasToken)
    
    // 如果已有token
    if (hasToken) {
        if (to.path === loginPath) {
            // 如果已有token但是还是请求登录页，直接到首页。
            next({ path: homePath })
        } else {
            // 已有token，但是是各个业务页，则完善用户信息。
            const name = store.getters.name
            console.log(name)
            if (name) {
                console.log('查到用户')
                next()
            } else {
                try {
                    console.log('查不到用户')
                    // 获取用户信息
                    await store.dispatch('user/getUserInfo')
                    console.log('获取到')
                    next()
                } catch (error) {
                    // 重置token，并要求重新登录。
                    console.log('获取不到')
                    await store.dispatch('user/resetToken')
                    Message.error(error || 'Has Error')
                    next(`${loginPath}?redirect=${to.path}`)
                }
            }
        }
    } else {
        /* 无token */

        if (whiteList.indexOf(to.path) !== -1) {
        // 在白名单中，直接跳转。
        next()
        } else {
            // 不在白名单中，必须登录。
            next(`${loginPath}?redirect=${to.path}`)
        }
    }
})